<?php

/**
 * @Descripttion : FOXCMS 是一款高效的 PHP 多端跨平台内容管理系统
 * @Author : FoxCMS Team
 * @Date : 2023/6/26   16:55
 * @version : V1.08
 * @copyright : ©2021-现在 贵州黔狐科技股份有限公司 版权所有
 * @LastEditTime : 2023/6/26   16:55
 */

use think\facade\Db;
use think\facade\Log;

include_once $this->getAppPath() . 'func/commont.php';

// 字节数Byte转换为KB、MB、GB、TB
function xn_file_size($size)
{
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
    for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024;
    return round($size, 2) . $units[$i];
}

// 当前目录下的文件列表
function getDirFile($directory, $activepath = '',  &$arr_file = array(), &$curTemplate = "default")
{
    if (!file_exists($directory)) {
        return false;
    }

    $fileArr = $dirArr = $parentArr = array();

    $mydir = dir($directory);
    while (false !== $file = $mydir->read()) {
        $filesize = $filetime = $intro = '';
        $filemine = 'file';

        if ($file != "." && $file != ".." && !is_dir("$directory/$file")) {
            @$filesize = filesize("$directory/$file");
            @$filesize = xn_file_size($filesize);
            @$filetime = date('Y-m-d', filemtime("$directory/$file"));
        }
        Log::info($file);
        if ($file == '.') {
            continue;
        } else if ($file == "..") {
            if ($activepath == "" || $activepath == (DIRECTORY_SEPARATOR . $curTemplate)) {
                continue;
            }
            $parentArr = array(
                array(
                    'filepath'  => preg_replace("#[\/][^\/]*$#i", "", $activepath),
                    'filename'  => '上级目录',
                    'filesize'  => '',
                    'filetime'  => '',
                    'filemine'  => 'dir',
                    'filetype'  => 'dir2',
                    'icon'      => 'file_topdir.gif',
                    'intro'  => '（当前目录：' . $activepath . '）',
                ),
            );
            continue;
        } else if (is_dir("$directory/$file")) {
            if (preg_match("#^_(.*)$#i", $file)) continue; #屏蔽FrontPage扩展目录和linux隐蔽目录
            if (preg_match("#^\.(.*)$#i", $file)) continue;
            $filepath = $activepath . '/' . $file;
            $filepath = replaceSymbol($filepath);
            $file_info = array(
                'filepath'  => $filepath,
                'filename'  => $file,
                'filesize'  => '',
                'filetime'  => '',
                'filemine'  => 'dir',
                'filetype'  => 'dir',
                'icon'      => 'dir.gif',
                'intro'     => '',
            );
            array_push($dirArr, $file_info);
            continue;
        } else if (preg_match("#\.(gif|png)#i", $file)) {
            $filemine = 'image';
            $filetype = 'gif';
            $icon = 'gif.gif';
        } else if (preg_match("#\.(jpg|jpeg|bmp|webp)#i", $file)) {
            $filemine = 'image';
            $filetype = 'jpg';
            $icon = 'jpg.gif';
        } else if (preg_match("#\.(svg)#i", $file)) {
            $filemine = 'image';
            $filetype = 'svg';
            $icon = 'jpg.gif';
        } else if (preg_match("#\.(swf|fla|fly)#i", $file)) {
            $filetype = 'flash';
            $icon = 'flash.gif';
        } else if (preg_match("#\.(zip|rar|tar.gz)#i", $file)) {
            $filetype = 'zip';
            $icon = 'zip.gif';
        } else if (preg_match("#\.(exe)#i", $file)) {
            $filetype = 'exe';
            $icon = 'exe.gif';
        } else if (preg_match("#\.(mp3|wma)#i", $file)) {
            $filetype = 'mp3';
            $icon = 'mp3.gif';
        } else if (preg_match("#\.(wmv|api)#i", $file)) {
            $filetype = 'wmv';
            $icon = 'wmv.gif';
        } else if (preg_match("#\.(rm|rmvb)#i", $file)) {
            $filetype = 'rm';
            $icon = 'rm.gif';
        } else if (preg_match("#\.(txt|inc|pl|cgi|asp|xml|xsl|aspx|cfm)#", $file)) {
            $filetype = 'txt';
            $icon = 'txt.gif';
        } else if (preg_match("#\.(htm|html)#i", $file)) {
            $filetype = 'htm';
            $icon = 'htm.gif';
        } else if (preg_match("#\.(php)#i", $file)) {
            $filetype = 'php';
            $icon = 'php.gif';
        } else if (preg_match("#\.(js)#i", $file)) {
            $filetype = 'js';
            $icon = 'js.gif';
        } else if (preg_match("#\.(css)#i", $file)) {
            $filetype = 'css';
            $icon = 'css.gif';
        } else {
            $filetype = 'other';
            $icon = 'other.gif';
        }

        $filepath = $activepath . '/' . $file;
        $filepath = replaceSymbol($filepath);
        $file_info = array(
            'filepath'  => $filepath,
            'filename'  => $file,
            'filesize'  => $filesize,
            'filetime'  => $filetime,
            'filemine'  => $filemine,
            'filetype'  => $filetype,
            'icon'      => $icon,
            'intro'     => $intro,
        );
        array_push($fileArr, $file_info);
    }
    $mydir->close();

    $arr_file = array_merge($parentArr, $dirArr, $fileArr);

    return $arr_file;
}

// 驼峰命名转下划线命名
function xn_uncamelize($camelCaps, $separator = '_')
{
    return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
}

// 密码加密函数
function xn_encrypt($password)
{
    $salt = 'fox';
    return md5(md5($password . $salt));
}

// 密码验证必须包含数字、大小写字母、特殊字符中至少3种,且不少于8位
function verify_password($password, $maxLength = "")
{
    $pattern  = '/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,' . $maxLength . '}$/';
    if (preg_match($pattern, $password)) {
        return true;
    }
    return false;
}

// 管理员操作日志
function xn_add_admin_log($remark, $type = 'system', $content = "")
{
    if ($type == "login") {
        $param = "";
    } else {
        $param = json_encode(request()->param(), JSON_UNESCAPED_UNICODE);
    }
    $data = [
        'admin_id' => session('admin_auth.id') ?? 0,
        'url' => request()->url(true),
        'ip' => request()->ip(),
        'remark' => $remark,
        'method' => request()->method(),
        'param' => $param,
        'create_time' => date('Y-m-d H:i:s', time()),
        'type' => $type,
        'content' => $content
    ];
    \app\common\model\AdminLog::insert($data);
}

/**
 * 获取自定义config/cfg目录下的配置
 * 用法： xn_cfg('base') 或 xn_cfg('base.website') 不支持无限极
 */
function xn_cfg($name, $default = '', $path = 'cfg')
{
    if (false === strpos($name, '.')) {
        $name = strtolower($name);
        $config  = \think\facade\Config::load($path . '/' . $name, $name);
        return $config ?? [];
    }
    $name_arr    = explode('.', $name);
    $name_arr[0] = strtolower($name_arr[0]);
    $filename = $name_arr[0];
    $config  = \think\facade\Config::load($path . '/' . $filename, $filename);
    return $config[$name_arr[1]] ?? $default;
}

// 根目录物理路径
function xn_root()
{
    return app()->getRootPath() . 'public';
}

/**
 * 构建图片上传HTML 单图
 * @param string $value
 * @param string $file_name
 * @param null $water 是否添加水印 null-系统配置设定 1-添加水印 0-不添加水印
 * @param null $thumb 生成缩略图，传入宽高，用英文逗号隔开，如：200,200（仅对本地存储方式生效，七牛、oss存储方式建议使用服务商提供的图片接口）
 */
function xn_upload_one($value, $file_name, $water = null, $thumb = null)
{
    $html = <<<php
    <div class="xn-upload-box">
        <div class="t layui-col-md12 layui-col-space10">
            <input type="hidden" name="{$file_name}" class="layui-input xn-images" value="{$value}">
            <div class="layui-col-md4">
                <div type="button" class="layui-btn webuploader-container" id="{$file_name}" data-water="{$water}" data-thumb="{$thumb}" style="width: 113px;"><i class="layui-icon layui-icon-picture"></i>上传图片</div>
                <div type="button" class="layui-btn chooseImage" data-num="1"><i class="layui-icon layui-icon-table"></i>选择图片</div>
            </div>
        </div>
        <ul class="upload-ul clearfix">
            <span class="imagelist"></span>
        </ul>
        <script>$('#{$file_name}').uploadOne();</script>
    </div>
php;
    return $html;
}

/**
 * 构建图片上传HTML 多图
 * @param string $value
 * @param string $file_name
 * @param null $water 是否添加水印 null-系统配置设定 1-添加水印 0-不添加水印
 * @param null $thumb 生成缩略图，传入宽高，用英文逗号隔开，如：200,200（仅对本地存储方式生效，七牛、oss存储方式建议使用服务商提供的图片接口）
 */
function xn_upload_multi($value, $file_name, $water = null, $thumb = null)
{
    $html = <<<php
    <div class="xn-upload-box">
        <div class="t layui-col-md12 layui-col-space10">
            <div class="layui-col-md8">
                <input type="text" name="{$file_name}" class="layui-input xn-images" value="{$value}">
            </div>
            <div class="layui-col-md4">
                <div type="button" class="layui-btn webuploader-container" id="{$file_name}" data-water="{$water}" data-thumb="{$thumb}" style="width: 113px;"><i class="layui-icon layui-icon-picture"></i>上传图片</div>
                <div type="button" class="layui-btn chooseImage"><i class="layui-icon layui-icon-table"></i>选择图片</div>
            </div>
        </div>
        <ul class="upload-ul clearfix">
            <span class="imagelist"></span>
        </ul>
        <script>$('#{$file_name}').upload();</script>
    </div>
php;
    return $html;
}

// 格式化标签，将空格、中文逗号替换成英文半角分号
function xn_format_tags($tags)
{
    $tags = trim($tags);
    $tags = str_replace(' ', ',', str_replace('，', ',', $tags));
    $arr = explode(',', $tags);
    $data = [];
    foreach ($arr as $v) {
        if ($v != '') {
            $data[] = $v;
        }
    }
    return implode(',', $data);
}

// 生成全局唯一标识符
function xn_create_guid()
{
    $charid = strtoupper(md5(uniqid(mt_rand(), true)));
    $hyphen = chr(45); // "-"
    $uuid = chr(123) // "{"
        . substr($charid, 0, 8) . $hyphen
        . substr($charid, 8, 4) . $hyphen
        . substr($charid, 12, 4) . $hyphen
        . substr($charid, 16, 4) . $hyphen
        . substr($charid, 20, 12)
        . chr(125); // "}"
    return $uuid;
}

// 生成订单号
function xn_create_order_no()
{
    $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
    $orderSn = $yCode[intval(date('Y')) - 2020] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
    return $orderSn;
}

// 保存缓存
function saveToCache($key, $value = '', $expire_in = -1)
{
    if ($expire_in == -1) {
        $expire_in = config("secure.token_expire_in");
    }
    $result = cache($key, $value, $expire_in);
    return $result;
}

if (!function_exists('tp_mkdir')) {
    /**
     * 递归创建目录
     * @param string $path 目录路径，不带反斜杠
     * @param intval $purview 目录权限码
     */
    function tp_mkdir($path, $purview = 0777)
    {
        if (!is_dir($path)) {
            tp_mkdir(dirname($path), $purview);
            if (!mkdir($path, $purview)) {
                return false;
            }
        }
        return true;
    }
}

if (!function_exists('dirFile')) {
    /**
     * 递归读取文件夹文件
     * @param string $directory 目录路径
     * @param string $dir_name 显示的目录前缀路径
     * @param array $arr_file 是否删除空目录
     */
    function dirFile($directory, $dir_name = '', &$arr_file = array())
    {
        if (!file_exists($directory)) {
            return false;
        }

        $mydir = dir($directory);
        while ($file = $mydir->read()) {
            $df = $directory . DIRECTORY_SEPARATOR . $file;
            $dnf = $dir_name . DIRECTORY_SEPARATOR . $file;
            if ((is_dir("$df")) and ($file != ".") and ($file != "..")) {
                if ($dir_name) {
                    dirFile("$df", "$dnf", $arr_file);
                } else {
                    dirFile("$df", "$file", $arr_file);
                }
            } else if (($file != ".") and ($file != "..")) {
                if ($dir_name) {
                    $arr_file[] = "$dnf";
                } else {
                    $arr_file[] = "$file";
                }
            }
        }
        $mydir->close();

        return $arr_file;
    }
}

if (!function_exists('foreachDirFile')) {
    /**
     * 递归读取文件夹文件
     * @param string $rootPath 根目录路径
     * @param string $directory 目录路径
     * @param string $dir_name 显示的目录前缀路径
     * @param array $arr_file 是否删除空目录
     * @param array $extarr 文件后缀数组
     * @param array $findarr 查找文件数组
     */
    function foreachDirFile($rootPath, $directory, $dir_name = '', &$arr_file = array(), $extarr = array(), $findarr = array())
    {
        if (!file_exists($directory)) {
            return false;
        }
        $mydir = dir($directory);
        while ($file = $mydir->read()) {
            $df = $directory . DIRECTORY_SEPARATOR . $file;
            $dnf = $dir_name . DIRECTORY_SEPARATOR . $file;
            if ((is_dir("$df")) and ($file != ".") and ($file != "..")) {
                if ($dir_name) {
                    foreachDirFile($rootPath, "$df", "$dnf", $arr_file, $extarr, $findarr);
                } else {
                    foreachDirFile($rootPath, "$df", "$file", $arr_file, $extarr, $findarr);
                }
            } else if (($file != ".") and ($file != "..")) {
                if ($dir_name) {
                    $gfile = "$dnf";
                } else {
                    $gfile = "$file";
                }
                $filePath = $rootPath . "/" . $gfile;
                $file = new \think\File($filePath);
                $extension = $file->getExtension();
                if (sizeof($extarr) > 0) {
                    if (!in_array($extension, $extarr)) {
                        continue;
                    }
                }
                $filesize = $file->getSize();
                $filename = $file->getFilename();
                $filesizeZ = xn_file_size($filesize);
                $filetime = date('Y-m-d H:i:s', filemtime("{$filePath}"));
                $dir = replaceSymbol($directory);
                $dirArr = explode("/", $dir);
                $dir = $dirArr[(sizeof($dirArr) - 1)];
                $arrFile = ["file" => $gfile, 'filesize' => $filesizeZ, "fsize" => $filesize, 'filetime' => $filetime, "filename" => $filename, "extension" => $extension, "dir" => $dir];
                if (sizeof($findarr) > 0) {
                    foreach ($findarr as $fileN) {
                        if (strpos($filename, $fileN) !== false) {
                            array_push($arr_file, $arrFile);
                            break;
                        }
                    }
                } else {
                    array_push($arr_file, $arrFile);
                }
            }
        }
        $mydir->close();

        return $arr_file;
    }
}

if (!function_exists('isDirFile')) {
    /**
     * 递归读取文件夹判断是否存在某个文件
     * @param string $directory 目录路径
     * @param string $fileName 文件名
     */
    function isDirFile($directory, $fileName = '', &$arr_file = array())
    {
        if (!file_exists($directory)) {
            return false;
        }
        if (empty($fileName)) {
            return false;
        }

        $mydir = dir($directory);
        while ($file = $mydir->read()) {
            if ($file == $fileName) {
                return ture;
            }
            $df = $directory . DIRECTORY_SEPARATOR . $file;
            if ((is_dir("$df")) and ($file != ".") and ($file != "..")) {
                isDirFile("$df", "$fileName", $arr_file);
            }
        }
        $mydir->close();
        return false;
    }
}

if (!function_exists('getFile')) {
    /**
     * 递归读取文件夹中的文件
     * @param string $directory 目录路径
     * @param string $fileName 文件名
     * @param boolean $isFull 是否全称对比
     */
    function getFile($directory, $fileName = '', $isFull = true)
    {
        if (!file_exists($directory)) {
            return "1";
        }
        if (empty($fileName)) {
            return "2";
        }

        $mydir = dir($directory);
        while ($file = $mydir->read()) {
            if (($file != ".") and ($file != "..")) {
                if ($isFull) {
                    if ($file == $fileName) {
                        return $directory . DIRECTORY_SEPARATOR . $file;
                    }
                } else {
                    if (strpos($file, $fileName) !== false) {
                        return $directory . DIRECTORY_SEPARATOR . $file;
                    }
                }
                $df = $directory . DIRECTORY_SEPARATOR . $file;
                if (is_dir("$df")) {
                    getDirFile("$df", "$fileName");
                }
            }
        }
        $mydir->close();
        return false;
    }
}

if (!function_exists('write')) {
    /**
     * 写文件
     * @param $path 文件路径 如D:text/ 等
     * @param $fileName 文件名 如fox.sql
     * @param $content 文件内容
     * @param $flag 默认文件内容追加
     */
    function write($path, $fileName, $content, $flag = FILE_APPEND)
    {
        if (tp_mkdir($path)) {
            $pfile = $path . $fileName;
            @file_put_contents($pfile, $content, $flag); //内容
            return $pfile;
        }
        return "";
    }
}

if (!function_exists('delDir')) {
    // 删除文件夹及所有文件
    function delDir($directory)
    { //自定义函数递归的函数整个目录
        if (file_exists($directory)) {
            if ($dir_handle = @opendir($directory)) { //打开目录返回目录资源，并判断是否成功
                while ($filename = readdir($dir_handle)) { //遍历目录，读出目录中的文件或文件夹
                    if ($filename != '.' && $filename != '..') { //一定要排除两个特殊的目录
                        $subFile = $directory . DIRECTORY_SEPARATOR . $filename; //将目录下的文件与当前目录相连
                        if (is_dir($subFile)) { //如果是目录条件则成了
                            delDir($subFile); //递归调用自己删除子目录
                        }
                        if (is_file($subFile)) { //如果是文件条件则成立
                            @unlink($subFile); //直接删除这个文件
                        }
                    }
                }
                closedir($dir_handle); //关闭目录资源
                @rmdir($directory); //删除空目录
            }
        }
    }
}

if (!function_exists('xCopy')) {
    /**
     * 文件夹复制文件
     * @param $source 源目录名
     * @param $destination 目的目录名
     * @param int $child 1:包括子目录，否则传0:不包括子目录；
     */
    function xCopy($source, $destination, $child = 1)
    {

        if (!is_dir($source)) {
            echo ("Error:the {$source} is not a direction!");
            return 0;
        }
        if (!is_dir($destination)) {
            mkdir($destination, 0777);
        }
        $handle = dir($source);
        while ($entry = $handle->read()) {
            if (($entry != ".") && ($entry != "..")) {
                if (is_dir($source . DIRECTORY_SEPARATOR . $entry)) {
                    if ($child) {
                        xCopy($source . DIRECTORY_SEPARATOR . $entry, $destination . DIRECTORY_SEPARATOR . $entry, $child);
                    }
                } else {
                    copy($source . DIRECTORY_SEPARATOR . $entry, $destination . DIRECTORY_SEPARATOR . $entry);
                }
            }
        }
        return 1;
    }
}

if (!function_exists('copyFile')) {
    /**
     * 复制文件
     * @param $sourceFile 源文件
     * @param $targetFile 目标文件
     */
    function copyFile($sourceFile, $targetFile)
    {
        if (!is_file($sourceFile)) {
            echo ("Error:the {$sourceFile} is not a file!");
            return false;
        }
        $targetDir = substr($targetFile, 0, strrpos($targetFile, DIRECTORY_SEPARATOR));
        if (tp_mkdir($targetDir)) {
            return copy($sourceFile, $targetFile);
        }
        return false;
    }
}


if (!function_exists('func_preg_replace')) {
    /**
     * 替换指定的符号
     * @param array $arr 特殊字符的数组集合
     * @param string $replacement 符号
     * @param string $str 字符串
     */
    function func_preg_replace($arr = array(), $replacement = ',', $str = '')
    {
        if (empty($arr)) {
            $arr = array('，');
        }
        foreach ($arr as $key => $val) {
            if (is_array($replacement)) {
                $replacevalue = isset($replacement[$key]) ? $replacement[$key] : current($replacement);
            } else {
                $replacevalue = $replacement;
            }
            $val = str_replace('/', '\/', $val);
            $str = preg_replace('/(' . $val . ')/', $replacevalue, $str);
        }

        return $str;
    }
}

if (!function_exists('func_param_pack')) {
    /**
     * 封装解析封装
     * @param array $params 参数数组
     * @param string $separator 分割符号
     */
    function func_param_pack($params = array(), $separator = '&')
    {
        $newParamArr = [];
        foreach ($params as $key => $v) {
            array_push($newParamArr, $key . "=" . $v);
        }
        return implode($separator, $newParamArr);
    }
}

if (!function_exists('func_random_num')) {
    /**
     * 生成随机数
     * @param int $offset 偏移量 默认0
     * @param int $length 长度 默认32
     */
    function func_random_num($offset = 0, $length = 32)
    {
        return substr(md5((string) microtime(true)), $offset, $length);
    }
}

if (!function_exists('createNonceStr')) {
    // 创建随机字符串
    function createNonceStr($length = 16)
    { //生成随机16个字符的字符串
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
}


if (!function_exists('serverIP')) {
    // 服务器端IP
    function serverIP()
    {
        // 因为解析问题可能导致后台卡
        if (!empty($_SERVER['SERVER_ADDR']) && !preg_match('/127\.0\.\d{1,3}\.\d{1,3}/i', $_SERVER['SERVER_ADDR']) && !preg_match('/192\.168\.\d{1,3}\.\d{1,3}/i', $_SERVER['SERVER_ADDR'])) {
            $serviceIp = $_SERVER['SERVER_ADDR'];
        } else {
            $serviceIp = @gethostbyname($_SERVER["SERVER_NAME"]);
        }
        return $serviceIp;
    }
}

if (!function_exists('getAccessIP')) {
    // 获取访问者id
    function getAccessIP()
    {
        static $realip;
        if (isset($_SERVER)) {
            if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
                $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
            } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
                $realip = $_SERVER["HTTP_CLIENT_IP"];
            } else {
                $realip = $_SERVER["REMOTE_ADDR"];
            }
        } else {
            if (getenv("HTTP_X_FORWARDED_FOR")) {
                $realip = getenv("HTTP_X_FORWARDED_FOR");
            } else if (getenv("HTTP_CLIENT_IP")) {
                $realip = getenv("HTTP_CLIENT_IP");
            } else {
                $realip = getenv("REMOTE_ADDR");
            }
        }
        return $realip;
    }
}

if (!function_exists('getPageTitle')) {
    // 获取页面标题
    function getPageTitle($url)
    {
        if (empty($url)) {
            return "";
        }
        $result = get_url_content($url);
        $title = preg_match('!<title>(.*?)</title>!i', $result, $matches) ? $matches[1] : '没有标题';
        return $title;
    }
}

if (!function_exists('getBrowser')) {
    // 获取用户浏览器类型
    function getBrowser()
    {
        $agent = $_SERVER["HTTP_USER_AGENT"];
        if (strpos($agent, 'MSIE') !== false || strpos($agent, 'rv:11.0')) //ie11判断
            return "ie";
        else if (strpos($agent, 'Firefox') !== false)
            return "firefox";
        else if (strpos($agent, 'Chrome') !== false)
            return "chrome";
        else if (strpos($agent, 'Opera') !== false)
            return 'opera';
        else if ((strpos($agent, 'Chrome') == false) && strpos($agent, 'Safari') !== false)
            return 'safari';
        else
            return 'unknown';
    }
}

if (!function_exists('getFromPage')) {
    // 获取网站来源
    function getFromPage()
    {
        return isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
    }
}

if (!function_exists('search_word_from')) {
    // 搜索关键词来源
    function search_word_from()
    {
        $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
        if (strstr($referer, 'baidu.com')) { //百度
            preg_match("|baidu.+wo?r?d=([^\\&]*)|is", $referer, $tmp);
            $keyword = urldecode($tmp[1]);
            $from = 'baidu';
        } elseif (strstr($referer, 'google.com') or strstr($referer, 'google.cn')) { //谷歌
            preg_match("|google.+q=([^\\&]*)|is", $referer, $tmp);
            $keyword = urldecode($tmp[1]);
            $from = 'google';
        } elseif (strstr($referer, 'so.com')) { //360搜索
            preg_match("|so.+q=([^\\&]*)|is", $referer, $tmp);
            $keyword = urldecode($tmp[1]);
            $from = '360';
        } elseif (strstr($referer, 'sogou.com')) { //搜狗
            preg_match("|sogou.com.+query=([^\\&]*)|is", $referer, $tmp);
            $keyword = urldecode($tmp[1]);
            $from = 'sogou';
        } elseif (strstr($referer, 'soso.com')) { //搜搜
            preg_match("|soso.com.+w=([^\\&]*)|is", $referer, $tmp);
            $keyword = urldecode($tmp[1]);
            $from = 'soso';
        } else {
            $keyword = '';
            $from = '';
        }
        return array('keyword' => $keyword, 'from' => $from);
    }
}

if (!function_exists('foxDate')) {
    /**
     * 时间转化日期格式
     * @param     string $format 日期格式
     * @param     intval $t 时间戳
     */
    function foxDate($format = 'Y-m-d', $t = '')
    {
        if (!empty($t)) {
            if (is_string($t)) {
                $t = strtotime($t);
            }
            $t = date($format, $t);
        }
        return $t;
    }
}

if (!function_exists("get_column_down")) {
    /**
     * 查询栏目及子栏目
     * @param $columnId 栏目id
     * @param $model 模型
     * @param $lang 语言标识
     */
    function get_column_down($columnId, $model = "", $lang = "")
    {

        $condition = "1=1";
        if (!empty($model)) {
            $modelArr = explode(",", $model);
            $modelsArr = [];
            foreach ($modelArr as $k => $md) {
                array_push($modelsArr, "'$md'");
            }
            if (sizeof($modelsArr) > 0) {
                $models = implode(",", $modelsArr);
                $condition = "`data`.column_model in ($models)";
            }
        }
        if (!empty($lang)) {
            $condition .= " and `data`.lang='{$lang}'";
        }
        $sql = <<<php
                SELECT
                    ID.`level`,
                   `data`.* 
                FROM
                    (
                    SELECT
                        @ids AS _ids,
                        ( SELECT @ids := GROUP_CONCAT( id ) FROM fox_column WHERE FIND_IN_SET( pid, @ids ) ) AS cids,
                        @l := @l + 1 AS `level` 
                    FROM
                        fox_column,
                        ( SELECT @ids:= $columnId, @l := 0 ) b 
                    WHERE
                        @ids IS NOT NULL 
                    ) ID,
                    fox_column `data` 
                WHERE
                    FIND_IN_SET( `data`.id, ID._ids ) 
                    AND $condition
                ORDER BY
                    ID.`level`
php;
        return Db::query($sql);
    }
}

if (!function_exists("get_down")) {
    /**
     * 查询自身及子数据
     * @param $tableName 表名
     * @param $id Id状态
     */
    function get_down($tableName, $id)
    {
        $sql = <<<php
                SELECT
                    ID.`level`,
                    `data`.*
                FROM
                    (
                    SELECT
                        @ids AS _ids,
                        ( SELECT @ids := GROUP_CONCAT( id ) FROM {$tableName} WHERE FIND_IN_SET( pid, @ids ) ) AS cids,
                        @l := @l + 1 AS `level` 
                    FROM
                        {$tableName},
                        ( SELECT @ids:= $id, @l := 0 ) b 
                    WHERE
                        @ids IS NOT NULL 
                    ) ID,
                    {$tableName} `data` 
                WHERE
                    FIND_IN_SET( `data`.id, ID._ids )
                ORDER BY
                    ID.`level`
php;
        return $sql;
        return Db::query($sql);
    }
}

if (!function_exists("get_column_up")) {
    /**
     * 查询栏目及父栏目
     * @param $columnId 栏目id
     * @param $lang 语言标识
     */
    function get_column_up($columnId, $model = "", $lang = "")
    {
        $condition = "1=1";
        if (!empty($model)) {
            $modelArr = explode(",", $model);
            $modelsArr = [];
            foreach ($modelArr as $k => $md) {
                array_push($modelsArr, "'$md'");
            }
            if (sizeof($modelsArr) > 0) {
                $models = implode(",", $modelsArr);
                $condition = "t2.column_model in ({$models})";
            }
        }
        if (!empty($lang)) {
            $condition .= " and t2.lang='{$lang}'";
        }
        $sql = <<<php
                SELECT
                    t1.lvl as `level`,
                    t2.*
                FROM
                    (
                    SELECT
                        @pid AS _id,
                        ( SELECT @pid := pid FROM fox_column WHERE id = _id ) AS pid,
                        @LEVEL := @LEVEL + 1 AS lvl
                    FROM
                        ( SELECT @pid := $columnId, @LEVEL := 0 ) vars,
                        fox_column c
                    WHERE
                        @pid <> 0
                    ) t1
                    JOIN ( SELECT * FROM fox_column ) t2 ON t1._id = t2.id
                where
                   {$condition}
                ORDER BY
                    t1.lvl DESC
php;
        return Db::query($sql);
    }
}

if (!function_exists("get_up")) {
    // 查询自身及父数据
    function get_up($tableName, $id)
    {
        $sql = <<<php
                SELECT
                    t1.lvl as `level`,
                    t2.*
                FROM
                    (
                    SELECT
                        @pid AS _id,
                        ( SELECT @pid := pid FROM {$tableName} WHERE id = _id ) AS pid,
                        @LEVEL := @LEVEL + 1 AS lvl 
                    FROM
                        ( SELECT @pid := {$id}, @LEVEL := 0 ) vars,
                        {$tableName} c 
                    WHERE
                        @pid <> 0 
                    ) t1
                    JOIN ( SELECT * FROM {$tableName} ) t2 ON t1._id = t2.id 
                ORDER BY
                    t1.lvl DESC
php;
        return Db::query($sql);
    }
}


if (!function_exists("cn_substr")) {
    /**
     * 去掉html标签
     * @param $content
     * @param int $length
     */
    function cn_substr(String $content, int $length = 10)
    {
        if (!empty($content) && $content != null) {
            $content = html_entity_decode($content); // 对传入的文章内容
            $content = strip_tags($content); // 去掉所有的html标签
            $content = mb_ereg_replace("\t", "", $content);
            $content = mb_ereg_replace("\r\n", "", $content);
            $content = mb_ereg_replace("\n", "", $content);
            $content = mb_ereg_replace(" ", "", $content);
            $content = mb_ereg_replace("  ", "", $content);

            if ($length > 0 && mb_strlen(trim($content), 'utf-8') > $length) {
                return mb_substr(trim($content), 0, $length, 'utf-8') . "...";
            } else {
                return trim($content);
            }
        } else {
            return $content;
        }
    }
}

if (!function_exists("en_substr")) {
    /**
     * 英文截取
     * @param $content
     * @param int $length
     */
    function en_substr(String $content, int $length = 10)
    {
        if (!empty($content) && $content != null) {
            $content = strip_tags($content); //去掉所有的html标签
            $content = mb_ereg_replace("\t", "", $content);
            $content = mb_ereg_replace("\r\n", "", $content);
            $content = mb_ereg_replace("\n", "", $content);
            $content = preg_replace('!\s+!', ' ', $content); // 多个空格变成一个
            $search = "&nbsp;"; // 多个&nbsp;变成一个&nbsp;
            $contentArr = explode($search, $content);
            $contentArr = array_unique($contentArr); // 去重
            $newContentArr = [];
            foreach ($contentArr as $key => $c) {
                if (!empty($c)) {
                    array_push($newContentArr, $c);
                }
            }
            $content = implode($search, $newContentArr);
            if ($length > 0 && mb_strlen(trim($content), 'utf-8') > $length) {
                return mb_substr(trim($content), 0, $length, 'utf-8') . "...";
            } else {
                return trim($content);
            }
        } else {
            return $content;
        }
    }
}

if (!function_exists("myTitle")) {
    /**
     * 内容长度省略
     * @param $content
     * @param int $length
     */
    function myTitle(String $content, int $length = 10)
    {
        $content = html_entity_decode($content); // 对传入的文章内容
        if ($length > 0 && mb_strlen(trim($content), 'utf-8') > $length) {
            return mb_substr(trim($content), 0, $length, 'utf-8') . "...";
        } else {
            return trim($content);
        }
    }
}

if (!function_exists("replaceSymbol")) {
    // 固定替换多个 // 与\ 符号为 /
    function replaceSymbol(string $content, $symbol = "/", $search = array('\\', '/'))
    {
        if (empty($content)) {
            return "";
        }
        $header = "";
        $end = "";
        if (str_ends_with($content, "/") || str_ends_with($content, "\\")) {
            $end = $symbol;
        }
        if (preg_match('/(http:\/\/)|(https:\/\/)/i', $content)) { // 判断是否存在
            if (preg_match('/(http:\/\/)/i', $content)) {
                $header = "http://";
                $content = mb_substr($content, 7);
            } else {
                $header = "https://";
                $content = mb_substr($content, 8);
            }
        } else {
            if (str_starts_with($content, "/") || str_starts_with($content, "\\")) {
                $header = $symbol;
            }
        }
        $content = str_replace($search, ',', $content);
        $contentArr = explode(",", $content);
        $contentArrR  = [];
        foreach ($contentArr as $k => $val) {
            if (!empty($val)) {
                array_push($contentArrR, $val);
            }
        }
        $content = $header . implode($symbol, $contentArrR) . $end;
        return $content;
    }
}

if (!function_exists("my_array_unique")) {
    /**
     * 数组对象去重
     * @param $array
     * @param bool $keep_key_assoc
     */
    function my_array_unique($array, $keep_key_assoc = false)
    {
        $duplicate_keys = array();
        $tmp = array();
        foreach ($array as $key => $val) {
            if (is_object($val))
                $val = (array)$val;

            if (!in_array($val, $tmp))
                $tmp[] = $val;
            else
                $duplicate_keys[] = $key;
        }
        foreach ($duplicate_keys as $key)
            unset($array[$key]);
        return $keep_key_assoc ? $array : array_values($array);
    }
}

if (!function_exists('add_slash')) {
    /**
     * 判断字符串斜杠 没有就加上
     * @param  $str $url 字符串
     */
    function add_slash($str)
    {
        if (empty($str)) {
            return "";
        } elseif (strpos($str, "/") !== false || strpos($str, "\\") !== false) {
            return replaceSymbol($str);
        } else {
            return "/" . $str;
        }
    }
}


if (!function_exists('is_mobile')) {
    function is_mobile()
    {
        // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
        if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return TRUE;
        }
        // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
        if (isset($_SERVER['HTTP_VIA'])) {
            return stristr($_SERVER['HTTP_VIA'], "wap") ? TRUE : FALSE; // 找不到为flase,否则为TRUE
        }
        // 判断手机发送的客户端标志,兼容性有待提高
        if (isset($_SERVER['HTTP_USER_AGENT'])) {
            $clientkeywords = array(
                'mobile',
                'nokia',
                'sony',
                'ericsson',
                'mot',
                'samsung',
                'htc',
                'sgh',
                'lg',
                'sharp',
                'sie-',
                'philips',
                'panasonic',
                'alcatel',
                'lenovo',
                'iphone',
                'ipod',
                'blackberry',
                'meizu',
                'android',
                'netfront',
                'symbian',
                'ucweb',
                'windowsce',
                'palm',
                'operamini',
                'operamobi',
                'openwave',
                'nexusone',
                'cldc',
                'midp',
                'wap'
            );
            // 从HTTP_USER_AGENT中查找手机浏览器的关键字
            if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
                return TRUE;
            }
        }
        if (isset($_SERVER['HTTP_ACCEPT'])) { // 协议法，因为有可能不准确，放到最后判断
            // 如果只支持wml并且不支持html那一定是移动设备
            // 如果支持wml和html但是wml在html之前则是移动设备
            if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== FALSE) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === FALSE || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
                return TRUE;
            }
        }
        return FALSE;
    }
}



if (!function_exists('time_diff')) {
    /**
     * 计算时间差
     * @param int $timestamp1 时间戳开始
     * @param int $timestamp2 时间戳结束
     */
    function time_diff($timestamp1, $timestamp2)
    {
        if ($timestamp2 <= $timestamp1) {
            return ['hours' => 0, 'minutes' => 0, 'seconds' => 0];
        }
        $timediff = $timestamp2 - $timestamp1;
        // 时
        $remain = (int)$timediff % 86400;
        $hours = (int)($remain / 3600);
        // 分
        $remain = (int)$timediff % 3600;
        $mins = (int)($remain / 60);
        // 秒
        $secs = (int)$remain % 60;
        $time = ['hours' => $hours, 'minutes' => $mins, 'seconds' => $secs];
        return $time;
    }
}

if (!function_exists('diff_time')) {
    // 时间差值转换
    function diff_time($timestamp)
    {
        // 时
        $remain = (int)$timestamp % 86400;
        $hours = (int)($remain / 3600);
        // 分
        $remain = (int)$timestamp % 3600;
        $mins = (int)($remain / 60);
        // 秒
        $secs = (int)$remain % 60;
        $time = ['hours' => $hours, 'minutes' => $mins, 'seconds' => $secs];
        return $time;
    }
}

if (!function_exists('num_en')) {
    // 获取字符串中的数字和英文
    function num_en($str)
    {
        preg_match_all('/[a-zA-Z0-9_]/u', $str, $matches);
        return join('', $matches[0]);
    }
}

if (!function_exists('get_between')) {
    /**
     * 截取
     * @param $str
     * @param $start 开始字符
     * @param $end 结束字符
     */
    function get_between($str, $start, $end)
    {
        $substr = substr($str, strlen($start) + strpos($str, $start), (strlen($str) - strpos($str, $end)) * (-1));
        return $substr;
    }
}

if (!function_exists('set_php_arr')) {
    /**
     * 设置php文件数组
     * @param $phpfile
     * @param $saveData
     */
    function set_php_arr($phpPath, $filename, $saveData)
    {
        //创建文件夹
        if (!tp_mkdir($phpPath)) {
            return "创建文件夹失败";
        }
        $phpfile = $phpPath . $filename;
        $str = "<?php\r\nreturn [\r\n";
        foreach ($saveData as $key => $val) {
            $str .= "\t'$key' => '$val',";
            $str .= "\r\n";
        }
        $str .= '];';
        file_put_contents($phpfile, $str);
    }
}

if (!function_exists('get_url_content')) {
    // 获取url内容
    function get_url_content($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($ch);
        return $result;
    }
}

if (!function_exists('post_url_content')) {
    // post 方式获取url内容
    function post_url_content($url, $data = array())
    {
        // 构建 POST 请求的选项
        $options = array(
            'http' => array(
                'method' => 'POST',
                'content' => http_build_query($data)
            )
        );
        // 创建上下文
        $context = stream_context_create($options);
        // 发送 POST 请求并获取响应结果
        $response = file_get_contents($url, false, $context);
        return $response;
    }
}

if (!function_exists('check_url')) {
    /**
     * 检测url网站地址是否能够访问
     * @param $url
     * @return bool
     */
    function check_url($url)
    {
        $ch = curl_init();
        $timeout = 1; // 设置超时的时间[单位：秒]
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_exec($ch);
        # 获取状态码赋值
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($httpcode == 200) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('get_dates')) {
    /**
     * 获取日期数组
     * @param string $time 默认今日
     * @param int $dateCount 最近日期数
     * @param string $format 日期结构
     */
    function get_dates($time = '', $dateCount = 7, $format = 'Y-m-d')
    {
        $time = $time != '' ? $time : time();
        //组合数据
        $dates = [];
        for ($i = 1; $i <= $dateCount; $i++) {
            $dates[$i] = date($format, strtotime('+' . $i - $dateCount . ' days', $time));
        }
        return $dates;
    }
}

if (!function_exists('get_week_first_last')) {
    // 获取一周的第一天和最后一天
    function get_week_first_last($time)
    {
        $rdata = [];
        // 当前日期
        $sdefaultDate = date("Y-m-d", $time);
        // $first =1 表示每周星期一为开始日期 0表示每周日为开始日期
        $first = 1;
        // 获取当前周的第几天 周日是 0 周一到周六是 1 - 6
        $w = date('w', strtotime($sdefaultDate));
        // 获取本周开始日期，如果$w是0，则表示周日，减去 6 天
        $week_start = date('Y-m-d', strtotime("$sdefaultDate -" . ($w ? $w - $first : 6) . ' days'));
        $rdata['week_first'] = $week_start;
        // 本周结束日期
        $week_end = date('Y-m-d', strtotime("$week_start +6 days"));
        $rdata['week_last'] = $week_end;
        return $rdata;
    }
}

if (!function_exists('get_month_first_last')) {
    // 获取当月的第一天和最后一天
    function get_month_first_last($time)
    {
        $rdata = [];
        $year = date("Y", $time);
        $month = date("m", $time);
        $allday = date("t", $time);
        $strat_time = strtotime($year . "-" . $month . "-1");
        $month_first = date('Y-m-d', $strat_time);
        $rdata['month_first'] = $month_first;
        $end_time = strtotime($year . "-" . $month . "-" . $allday);
        $month_last = date('Y-m-d', $end_time);
        $rdata['month_last'] = $month_last;
        return $rdata;
    }
}

if (!function_exists('get_app_name')) {
    // 获取获取应用项目名称
    function get_app_name()
    {
        $rp = root_path();
        $rpArr = explode(DIRECTORY_SEPARATOR, $rp);
        $ap = "foxcms";
        if (sizeof($rpArr) >= 2) {
            $ap = $rpArr[sizeof($rpArr) - 2];
        }
        return $ap;
    }
}

if (!function_exists('new_is_writeable')) {
    // 判断 文件/目录 是否可写（取代系统自带的 is_writeable 函数）
    function new_is_writeable($file)
    {
        if (is_dir($file)) {
            $dir = $file;
            if ($fp = @fopen("$dir/test.txt", 'w')) {
                @fclose($fp);
                @unlink("$dir/test.txt");
                $writeable = 1;
            } else {
                $writeable = 0;
            }
        } else {
            if ($fp = @fopen($file, 'a+')) {
                @fclose($fp);
                $writeable = 1;
            } else {
                $writeable = 0;
            }
        }
        return $writeable;
    }
}

if (!function_exists('php_path')) {
    // 获取php路径
    function php_path()
    {
        $phpArr = explode(DIRECTORY_SEPARATOR, PHP_BINARY);
        $length = sizeof($phpArr);
        $phpArr[($length - 1)] = "php";
        $php_path = implode(DIRECTORY_SEPARATOR, $phpArr);
        return $php_path;
    }
}

if (!function_exists('remove_str_bom')) {
    // 去除bom特殊字符  b"ï"  b"»"  b"¿"
    function remove_str_bom($content)
    {
        if (strlen($content) < 3) {
            return $content;
        }
        if (substr($content, 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf)) {
            $content = substr($content, 3);
        }
        return $content;
    }
}

if (!function_exists('rgba_to_hex')) {
    // RGBA颜色值转十六进制颜色值
    function rgba_to_hex($rgba)
    {
        $rgba = str_replace('rgba(', '', $rgba);
        $rgba = str_replace(')', '', $rgba);
        $colors = explode(',', $rgba);
        $r = dechex($colors[0]);
        $g = dechex($colors[1]);
        $b = dechex($colors[2]);
        $a = dechex(round($colors[3] * 255));
        if (strlen($r) == 1) $r = '0' . $r;
        if (strlen($g) == 1) $g = '0' . $g;
        if (strlen($b) == 1) $b = '0' . $b;
        if (strlen($a) == 1) $a = '0' . $a;
        $hex = '#' . $r . $g . $b;
        return $hex;
    }
}

if (!function_exists('pattern_replace')) {
    // 正则替换
    function pattern_replace($pattern, $replace, $subject)
    {
        $rcontent = preg_replace($pattern, $replace, $subject);
        $is_replace = 0;
        if ($subject != $rcontent) {
            $is_replace = 1;
        }
        $rdata = [
            'subject' => $rcontent,
            'is_replace' => $is_replace
        ];
        return $rdata;
    }
}

if (!function_exists('form_replace')) {
    // 表单内容替换
    function form_replace($fieldVal)
    {
        $fieldVal = htmlspecialchars($fieldVal); //某些字符转换为 HTML 实体
        $fieldVal = htmlentities($fieldVal); //函数通常用于防止 XSS 攻击。
        $fieldVal = addslashes($fieldVal); //在特殊字符前面加反斜杠
        //去掉多个./和/
        $patter = "/(\.*\/)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //去掉过多)
        $patter = "/\)+/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //去掉 by 加数字
        $patter = "/( by|By|bY \d+)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //去掉数字'或数字--
        $patter = "/(\d')|(\d+-+)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //去掉数字=数字
        $patter = "/(\d+=\d+)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //去掉多余的点
        $patter = "/(\.+)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //过滤sleep(60)
        $patter = "/sleep\(\d+\)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //过滤add
        $patter = "/( and|And|aNd|anD|ANd|AnD|aND )/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //过滤or
        $patter = "/( OR|or|Or|oR )/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //过滤<>
        $patter = "/(<|>)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        //过滤Response.Write或print特殊单词 die
        $patter = "/(Response.Write|print|die|.php)/";
        $rd = pattern_replace($patter, "", $fieldVal);
        if ($rd['is_replace'] == 1) {
            $fieldVal = $rd['subject'];
        }
        return $fieldVal;
    }
}

if (!function_exists('dataD')) {
    function dataD($string, $key = 'foxcms')
    {
        $ckey_length = 4;
        $key = md5($key);
        $keya = md5(substr($key, 0, 16));
        $keyb = md5(substr($key, 16, 16));
        $keyc = substr($string, 0, $ckey_length);
        $cryptkey = $keya . md5($keya . $keyc);
        $key_length = strlen($cryptkey);
        $string =  base64_decode(substr($string, $ckey_length));
        $string_length = strlen($string);
        $result = '';
        $box = range(0, 255);
        $rndkey = array();
        for ($i = 0; $i <= 255; $i++) {
            $rndkey[$i] = ord($cryptkey[$i % $key_length]);
        }
        for ($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        for ($a = $j = $i = 0; $i < $string_length; $i++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    }
}

if (!function_exists('err_code_translate')) {
    // 自定义异常错误码翻译
    function err_code_translate($code, $message)
    {
        $errcode = xn_cfg('errcode');
        $isFail = false;
        foreach ($errcode as $ecode => $emessage) {
            if (strpos($message, $ecode) !== false) {
                $message = $emessage;
                $isFail = true;
                break;
            }
        }
        if (!$isFail) {
            $message = "<h2>系统错误,请联系客服!</h2>";
        }
        return $message;
    }
}